#include <iostream>
#include <queue>
using namespace std;

const int kMaxN = 1e5 + 10;
const int kInf = 1e9;

int a[kMaxN], f[kMaxN];
int lp[kMaxN];

int DP(int n, int s, int l) {
  deque<int> max_deq, min_deq;

  for (int i = n, j = n; i > 0; i--) {
    for (; j > 0; j--) {
      for (; !max_deq.empty() && a[max_deq.back()] <= a[j]; max_deq.pop_back());
      max_deq.push_back(j);
      for (; !min_deq.empty() && a[min_deq.back()] >= a[j]; min_deq.pop_back());
      min_deq.push_back(j);
      if (a[max_deq.front()] - a[min_deq.front()] > s) {
        break;
      }
    }
    lp[i] = j;
    if (min_deq.front() == i) {
      min_deq.pop_front();
    }
    if (max_deq.front() == i) {
      max_deq.pop_front();
    }
  }

  deque<int> f_deq;
  fill(f, f + n + 1, kInf);
  f[0] = 0;
  for (int i = 1, j = 0; i <= n; i++) {
    if (j + l <= i) {
      for (; !f_deq.empty() && f[f_deq.back()] >= f[j]; f_deq.pop_back());
      if (f[j] != kInf) {
        f_deq.push_back(j);
      }
      j++;
    }
    for (; !f_deq.empty() && lp[i] > f_deq.front(); f_deq.pop_front());
    if (!f_deq.empty()) {
      f[i] = f[f_deq.front()] + 1;
    }
  }

  return f[n] == kInf ? -1 : f[n];
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, s, l;

  cin >> n >> s >> l;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  cout << DP(n, s, l) << "\n";
  return 0;
}